package com.orcsystem.product.app;

import java.util.concurrent.*;

/**
 * @CreateData: 2021/04/27-11:30
 * Author   AiHongSen
 * 方法说明
 * SL 查询、DL 删除、UP 更新、IN 新增方法
 * MyThreadPool->作用:
 */
public class MyThreadPool {
    public static ExecutorService service = Executors.newFixedThreadPool(10);
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        SonCallable callable = new SonCallable();
        FutureTask<Integer> futureTask = new FutureTask<Integer>(callable);
        service.execute(futureTask);
        Integer integer = futureTask.get();
        System.out.println("打印当前结果=>" + integer);

        /**
         * 参数说明
         * 参数1： corePoolSize   核心线程数 线程池创建好以后 就准备就绪的线程数量，等待接受异步任务
         * 参数2:  maximumPoolSize  线程池最大线程数量  池里能容纳的最大线程  (控制资源并发)  例如设置100  当并发进来800个此时也是100个/次去处理
         * 参数3;  keepAliveTime  最大存活时间 如果当前线程数量大于核心corePoolSize数量（maximumPoolSize-corePoolSize） 释放最大线程空闲的线程(当 线程空闲 大于指定的存活时间keepAliveTime)
         * 参数4:  unit  时间单位
         * 参数5： BlockingQueue<Runnable> workQueue 阻塞队列 。 如果任务有很多。就会将目前多的任务放入队列里。当有线程空闲 就会来队列取出任务 继续执行
         * 参数6： threadFactory  创建线程的工厂
         * 参数7:  RejectedExecutionHandler handler  如果队列满了 按照指定的拒绝策略 拒绝执行任务;
         *
         * 执行顺序
         * 1、线程池创建，准备好core数量的核心线程，准备接受任务
         * 2、新的任务进来，用core准备好的空闲线程执行。
         * 2-1、core满了，就将再进来的任务放入阻塞队列中。空闲的core就会自己去阻塞队列获取任务执行
         * 2-2、阻塞队列满了，就直接开新线程执行，最大只能开到max 指定的数量
         * 2-3、max都执行好了。Max-core 数量空闲的线程会在keepAliveTime指定的时间后自动销毁。最终保持到core大小
         * 2-4、如果线程数开到了max的数量，还有新任务进来，就会使用reject 指定的拒绝策略进行处理
         * 3、所有的线程创建都是由指定的factory创建的。
         */
        new ThreadPoolExecutor(5,200,10
                               ,TimeUnit.SECONDS,new LinkedBlockingDeque<>(1000)
                               ,Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());


    }
    static class SonCallable implements Callable{
        @Override
        public Object call() throws Exception {
            return 46+9;
        }
    }
}
